#!/usr/bin/env python3
"""
验证Specifier和SpecifierSet关系的理解
"""

from packaging.specifiers import SpecifierSet, Specifier
from packaging.version import Version

def verify_understanding():
    """验证理解"""
    print("=== 验证Specifier和SpecifierSet的关系 ===")
    
    # 创建多个Specifier
    spec1 = Specifier(">=1.0.0")  # 大于等于1.0.0
    spec2 = Specifier("<2.0.0")   # 小于2.0.0
    spec3 = Specifier("!=1.5.0")  # 不等于1.5.0
    
    print("1. 创建三个Specifier:")
    print(f"   spec1: {spec1} (>=1.0.0)")
    print(f"   spec2: {spec2} (<2.0.0)")
    print(f"   spec3: {spec3} (!=1.5.0)")
    
    # 创建SpecifierSet（集合体）
    specset = SpecifierSet(">=1.0.0,<2.0.0,!=1.5.0")
    print(f"\n2. 创建SpecifierSet: {specset}")
    print(f"   内部包含的Specifier: {list(specset)}")
    
    # 测试版本
    test_versions = ["0.9.0", "1.0.0", "1.4.0", "1.5.0", "1.6.0", "2.0.0"]
    
    print(f"\n3. 测试各个版本:")
    print(f"   版本    | spec1(>=1.0.0) | spec2(<2.0.0) | spec3(!=1.5.0) | SpecifierSet(所有) | 结果")
    print(f"   --------|----------------|----------------|----------------|-------------------|------")
    
    for version in test_versions:
        # 每个Specifier的判断结果
        result1 = spec1.contains(version)
        result2 = spec2.contains(version)
        result3 = spec3.contains(version)
        
        # SpecifierSet的判断结果（所有Specifier的并集）
        result_set = specset.contains(version)
        
        # 手动计算并集结果
        manual_result = result1 and result2 and result3
        
        print(f"   {version:8} | {str(result1):14} | {str(result2):14} | {str(result3):14} | {str(result_set):17} | {str(manual_result)}")
    
    print(f"\n4. 验证理解:")
    print(f"   ✓ SpecifierSet是Specifier的集合体")
    print(f"   ✓ 每个Specifier判断单个条件")
    print(f"   ✓ SpecifierSet判断所有条件的并集（AND逻辑）")
    print(f"   ✓ 只有所有Specifier都满足，SpecifierSet才返回True")
    
    print(f"\n5. 实际应用:")
    print(f"   - 依赖管理：一个包可能有多个版本要求")
    print(f"   - 例如：'>=1.0.0,<2.0.0,!=1.5.0'")
    print(f"   - 必须同时满足：>=1.0.0 AND <2.0.0 AND !=1.5.0")
    print(f"   - 最终结果：1.0.0 <= 版本 < 2.0.0 且 版本 != 1.5.0")

def test_manual_vs_automatic():
    """测试手动计算vs自动计算"""
    print(f"\n=== 手动计算vs自动计算对比 ===")
    
    specset = SpecifierSet(">=1.0.0,<2.0.0,!=1.5.0")
    
    # 手动分解
    specs = list(specset)
    print(f"手动分解SpecifierSet:")
    for i, spec in enumerate(specs):
        print(f"  {i+1}. {spec}")
    
    test_version = "1.4.0"
    print(f"\n测试版本: {test_version}")
    
    # 手动计算
    manual_results = []
    for spec in specs:
        result = spec.contains(test_version)
        manual_results.append(result)
        print(f"  {spec}: {result}")
    
    manual_final = all(manual_results)
    print(f"手动计算最终结果: {manual_final}")
    
    # 自动计算
    automatic_result = specset.contains(test_version)
    print(f"自动计算最终结果: {automatic_result}")
    
    print(f"结果一致: {manual_final == automatic_result}")

def test_empty_specifierset():
    """测试空SpecifierSet的特殊情况"""
    print(f"\n=== 空SpecifierSet特殊情况 ===")
    
    empty_set = SpecifierSet("")
    print(f"空SpecifierSet: {empty_set}")
    print(f"内部Specifier数量: {len(empty_set)}")
    
    test_versions = ["0.9.0", "1.0.0", "1.5.0", "2.0.0"]
    
    print(f"\n空集合的行为:")
    for version in test_versions:
        result = empty_set.contains(version)
        print(f"  {version}: {result}")
    
    print(f"\n解释:")
    print(f"  - 空集合没有约束条件")
    print(f"  - 任何版本都满足'没有约束'")
    print(f"  - 这是设计决策：all([]) = True")

def main():
    """主函数"""
    print("Specifier和SpecifierSet关系验证")
    print("=" * 60)
    
    verify_understanding()
    test_manual_vs_automatic()
    test_empty_specifierset()
    
    print(f"\n总结:")
    print(f"✓ SpecifierSet = Specifier的集合体")
    print(f"✓ 每个Specifier = 单个版本约束条件")
    print(f"✓ SpecifierSet.contains() = 所有Specifier.contains()的AND结果")
    print(f"✓ 这就是为什么您的依赖管理系统能智能处理复杂约束！")

if __name__ == "__main__":
    main()